/*
 * @Description: 
 * @Author: Jimmy
 * @Date: 2023-07-23 10:16:35
 * @LastEditTime: 2023-08-06 19:18:38
 * @LastEditors:  
 */
import { Context } from "koa";
import jwt from 'jsonwebtoken'
import UseService from '../service/user.service'
import { callbackData } from "../utils/data.handler";
import { access, sql } from "../logger";
import { pagination } from "../utils/pagination";
import xlsx from 'node-xlsx'
import moment from "moment";

class UserController {
    //新增用户
    async createUserInfo(ctx: Context) {
        //获取数据
        const { username = '', nickname = '', phone = '', avatar = '', role_id, depart_id,password = '', is_admin = 0 } = ctx.request.body;
        // 操作数据库
        try {
            const res = await UseService.createUser({ username, nickname, phone, avatar, role_id,depart_id, password, is_admin });
            // 返回结果
            access.info('添加用户成功', { username: res.username })
            ctx.body = callbackData('0', '添加用户成功')
        } catch (err) {
            sql.error('添加用户失败', err)
            console.error('添加用户失败', err)
            ctx.app.emit('error', callbackData('3', '添加用户失败'), ctx);
        }
    }
    //删除用户
    async deleteUserInfo(ctx: Context) {
        let { ids = '' } = JSON.parse(JSON.stringify(ctx.query));
        if (!ids) {
            access.error('请选择删除用户')
            console.error('请选择删除用户')
            ctx.app.emit('error', callbackData('1', '请选择删除用户'), ctx);
            return false;
        }
        try {
            let idBox = ids.split(',');
            await UseService.deleteById(idBox)
            // 返回结果
            sql.info('删除用户成功', { ids })
            ctx.body = callbackData('0', '删除用户成功')
        } catch (err) {
            sql.error('删除用户失败', err)
            console.error('删除用户失败', err)
            ctx.app.emit('error', callbackData('3', '删除用户失败'), ctx);
        }
    }
    //更新用户信息
    async updateUserInfo(ctx: Context) {
        const { id, username, nickname = '', phone = '', avatar = '', role_id, depart_id, status, is_admin } = ctx.request.body;
        if (!id) {
            access.error('请选择更新用户')
            console.error('请选择更新用户')
            ctx.app.emit('error', callbackData('1', '请选择更新用户'), ctx);
            return false;
        }
        // 操作数据库
        try {
            await UseService.updateById({ id, nickname, phone, avatar, role_id, depart_id, status, is_admin });
            // 返回结果
            access.info('更新用户成功', { username })
            ctx.body = callbackData('0', '更新用户成功')
        } catch (err) {
            sql.error('更新用户失败', err)
            console.error('更新用户失败', err)
            ctx.app.emit('error', callbackData('3', '更新用户失败'), ctx);
        }
    }
    //查询用户信息
    async getUserInfo(ctx: Context) {
        //获取数据
        const { username = '', id = '', phone } = JSON.parse(JSON.stringify(ctx.query)) || {};
        try {
            //从返回结果中剔除password，其他属性放入新的对象中
            const { password, ...resUser } = await UseService.getUserInfo({ id, username, phone })
            // 返回结果
            access.info('查询成功', { username: username })
            ctx.body = callbackData('0', '查询成功', resUser)
        } catch (err) {
            sql.error('用户登录失败', err)
            console.error('用户登录失败', err)
            ctx.app.emit('error', callbackData('3', '用户登录失败'), ctx);
        }
    }
    //查询用户列表
    async queryList(ctx: Context) {
        //获取数据
        const { username = '', nickname = '', phone = '', depart_id = '', role_id = '', is_admin, status = '' } = JSON.parse(JSON.stringify(ctx.query)) || {};
        const { page = 1, size = 10 } = ctx.request.body;
        try {
            //从返回结果中剔除password，其他属性放入新的对象中
            const res = await UseService.getUserList({ username, nickname, phone, page, size, depart_id, role_id, is_admin, status })
            // 返回结果
            if (res) {
                let { count, rows } = res;
                sql.info('查询成功', { username, page, size, is_admin })
                ctx.body = callbackData('0', '查询成功', pagination(rows, page, count, size))
            } else {
                sql.error('用户列表查询失败', { username, page, size, is_admin })
                console.error('用户列表查询失败', { username, page, size, is_admin })
                ctx.app.emit('error', callbackData('3', '用户列表查询失败'), ctx);
            }
        } catch (err) {
            sql.error('用户列表查询失败', err)
            console.error('用户列表查询失败', err)
            ctx.app.emit('error', callbackData('3', '用户列表查询失败'), ctx);
        }
    }

    //批量上传处理
    async dealGroupUser(ctx:Context){
        // 获取上传的文件
        const file = ctx.request.files.file;
        if(file){
            // @ts-ignore
            let {filepath} = file
            let sheets = xlsx.parse(filepath);
            let arr = []; // 全部表中的数据
            sheets.forEach((sheet) => {
                for (let i = 1; i < sheet['data'].length; i++) {
                    //excel第一行是是表头，所以从1开始循环
                    let row = sheet['data'][i]; // 获取行数据
                    if (row && row.length > 0) {
                        // moment处理 ISO 8601格式的时间,\
                        // var dateTime = moment(row[2]).utc(true);
                        arr.push({
                            username: row[0],     // row[0]对应表格里A列
                            nickname: row[1], // row[1]对应表格里B列
                            phone: row[2], // row[1]对应表格里B列
                            role_name: row[3], // row[1]对应表格里B列
                            // 使用偏移与时间时间保持一致
                            // brith: dateTime.format('YYYY-MM-DD HH:mm'),  
                        });
                    }
                }
                console.log('读取的数据', arr)
            });
        }else{
            console.error('请上传文件')
            ctx.app.emit('error', callbackData('1', '请上传文件'), ctx);
        }
    }
}

export default new UserController